using System;
using System.Threading;

namespace Mbs.Messaging.Imp
{
    [Serializable]
    class PoolInvoker : AsyncInvoker
    {
        protected override void Invoke(Delegate handler, params object[] args)
        {
            handler.DynamicInvoke(args);
        }

        protected override void AsyncInvoke(Delegate handler, params object[] args)
        {
            //Future.Create(() => handler.DynamicInvoke(args));
            ThreadPool.QueueUserWorkItem(s => handler.DynamicInvoke(args));
        }
    }

    //class FullPoolInvoker : PoolInvoker
    //{
    //    public override void Invoke<TMessage>(PreFilterHandler<TMessage>[] filters, PreFilterEventArgs<TMessage> e)
    //    {
    //        if (filters == null || filters.Length < 1)
    //            return;

    //        List<IFuture> futures = new List<IFuture>(filters.Length);
    //        foreach (var item in filters)
    //        {
    //            futures.Add(Future.Create(() => item.DynamicInvoke(e.Sender, e)));
    //        }

    //        if (e.Canceled)
    //            return;

    //        foreach (var item in futures)
    //        {
    //            if (item.Wait())
    //            {
    //                if (e.Canceled)
    //                    return;
    //            }
    //            else
    //            {
    //                e.Canceled = true;
    //                return;
    //            }
    //        }
    //    }

    //    protected override void Invoke<TMessage>(FilterHandler<TMessage>[] filters, FilterEventArgs<TMessage> e)
    //    {

    //        List<IFuture> futures = new List<IFuture>(filters.Length);
    //        foreach (var item in filters)
    //        {
    //            futures.Add(Future.Create(() => item.DynamicInvoke(e.Sender, e)));
    //        }

    //        if (e.Ignored)
    //            return;

    //        foreach (var item in futures)
    //        {
    //            if (item.Wait())
    //            {
    //                if (e.Ignored)
    //                    return;
    //            }
    //            else
    //            {
    //                e.Ignored = true;
    //                return;
    //            }
    //        }
    //    }

    //}
}
